package com.niit.session22;

import java.util.function.Consumer;
import java.util.function.UnaryOperator;

public class Test {
	public static void main(String[] args) {
/**************************使用匿名内部类来实现接口并且重写接口里的方法*********************************/		
		Calculate calculate = new Calculate() {
			@Override
			public void calculate(int a, int b) {
				System.out.println("计算的结果是："+(a+b));
			}
		};
		calculate.calculate(2, 3);
		/**************************使用lambda表达式*********************************/		
//		->左边写的是方法的形参，右边写的是方法体，lambda表达式省略了方法名字
		Calculate c1 = (int a, int b) -> {
			System.out.println("计算的结果是："+(a+b));
		};
		c1.calculate(5, 10);
//		形参里的数据类型可以省略
		Calculate c2 = (a, b) ->  {
			System.out.println("计算的结果是："+(a+b));
		};
		c2.calculate(5, 10);
//		如果方法体只有一行代码，可以省略方法体的大括号
//		优雅
		Calculate c3 = (a, b) -> System.out.println("计算的结果是："+(a+b));
		c3.calculate(5, 10);
//		如果自己定义的函数是接口不够用，可以直接使用系统提供的函数式接口
//		例如，这里的需求是定义一个一元一次函数，参数和返回值数据类型相同的清空就可以使用UnaryOperator
		UnaryOperator<Integer> u = (a) -> {return a*2;};
		System.out.println(u.apply(3));
//		如果形参只有一个，可以省略形参的括号
//		如果return语句一行代码可以写完，可以省略return关键字
		UnaryOperator<Integer> u1 = a -> a*2;
		System.out.println(u1.apply(3));
		
//		lambda表达式可以当作参数来传递
		test((a, b) -> System.out.println("计算的结果是："+(a+b)));
		
//		正常的lambda表达式的写法
		Consumer<String> consumer = s -> System.out.println(s);
		consumer.accept("Hello");
//		方法引用：当函数式接口的抽象方法形参和你重写的方法里调用的方法形参一致时，可以使用方法引用
//		写法:省略了形参和箭头-> ,调用方法直接用::方法名
		Consumer<String> consumer1 = System.out::println;
		consumer1.accept("Hello");
	}
	public static  void test(Calculate c) {
		c.calculate(4, 2);
	}
	

}
